package com.sz.virtualbank.dao.mapper;

import com.sz.virtualbank.dao.entity.InvestmentOrder;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 理财订单Mapper接口
 * 
 * @author Claude
 */
@Mapper
public interface InvestmentOrderMapper {
    
    /**
     * 新增理财订单
     *
     * @param order 理财订单
     * @return 影响行数
     */
    int insert(InvestmentOrder order);
    
    /**
     * 更新理财订单
     *
     * @param order 理财订单
     * @return 影响行数
     */
    int update(InvestmentOrder order);
    
    /**
     * 根据ID查询理财订单
     *
     * @param id 订单ID
     * @return 理财订单
     */
    InvestmentOrder selectById(Long id);
    
    /**
     * 根据订单编号查询理财订单
     *
     * @param orderNo 订单编号
     * @return 理财订单
     */
    InvestmentOrder selectByOrderNo(String orderNo);
    
    /**
     * 查询用户的理财订单列表
     *
     * @param userId 用户ID
     * @param status 订单状态（可选）
     * @param offset 偏移量
     * @param limit 每页条数
     * @return 理财订单列表
     */
    List<InvestmentOrder> selectByUserId(@Param("userId") Long userId, 
                                        @Param("status") Integer status,
                                        @Param("offset") Integer offset, 
                                        @Param("limit") Integer limit);
    
    /**
     * 统计用户的理财订单数量
     *
     * @param userId 用户ID
     * @param status 订单状态（可选）
     * @return 记录数量
     */
    int countByUserId(@Param("userId") Long userId, @Param("status") Integer status);
    
    /**
     * 更新订单状态
     *
     * @param id 订单ID
     * @param status 状态
     * @return 影响行数
     */
    int updateStatus(@Param("id") Long id, @Param("status") Integer status);
    
    /**
     * 查询即将到期的订单
     *
     * @param dueTime 到期时间
     * @return 订单列表
     */
    List<InvestmentOrder> selectByDueTime(LocalDateTime dueTime);
    
    /**
     * 更新实际收益并设置状态为已到期
     *
     * @param id 订单ID
     * @param actualProfit 实际收益
     * @return 影响行数
     */
    int updateProfit(@Param("id") Long id, @Param("actualProfit") BigDecimal actualProfit);
    
    /**
     * 查询产品的所有订单
     *
     * @param productId 产品ID
     * @return 订单列表
     */
    List<InvestmentOrder> selectByProductId(Long productId);
}
